package com.yunyao.dao.service.bamu.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.common.constant.enums.DataDeletedStatus;
import com.yunyao.dao.mapper.BamuContractNodePayMapper;
import com.yunyao.dao.model.BamuContractNodePay;
import com.yunyao.dao.service.bamu.IBamuContractNodePayService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 合同付款方式节点信息表 服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class BamuContractNodePayServiceImpl extends ServiceImpl<BamuContractNodePayMapper, BamuContractNodePay> implements IBamuContractNodePayService {




    @Override
    public void add(@NotNull BamuContractNodePay dto){
        Date date = new Date();
        dto.setIsDeleted(DataDeletedStatus.NO.getType());
        dto.setCreatedAt(date);
        dto.setUpdatedAt(date);
        save(dto);
    }



    /**
     * 根据合同ID查询付款节点列表
     *
     * @param contractId 合同ID
     * @return 付款节点列表如果合同ID为空或无效，则返回空列表
     */
    @Override
    public List<BamuContractNodePay> listByContractId(String contractId) {
        // 检查合同ID是否为空或无效
        if (StringUtils.isBlank(contractId)) {
            // 如果是，则返回一个不可变的空列表
            return List.of();
        }
        // 构建查询条件
        LambdaQueryWrapper<BamuContractNodePay> wrapper = new LambdaQueryWrapper<BamuContractNodePay>()
                .eq(BamuContractNodePay::getContractId, contractId)
                .eq(BamuContractNodePay::getIsDeleted, DataDeletedStatus.NO.getType());
        // 使用构建的查询条件执行查询并返回结果
        return list(wrapper);
    }

    /**
     * 根据合同ID删除合同节点支付信息
     * 此方法通过更新数据库中的isDeleted字段来逻辑删除与指定合同ID相关的所有支付节点信息
     * 如果合同ID为空或空白，则不执行任何操作并直接返回
     *
     * @param contractId 合同的唯一标识符
     */
    @Override
    public void deletedByContractId(String contractId) {
        // 检查合同ID是否为空或空白，如果是，则不进行删除操作
        if (StringUtils.isBlank(contractId)) {
            return;
        }
        // 创建一个条件更新包装器，用于指定更新条件和内容
        LambdaUpdateWrapper<BamuContractNodePay> wrapper =
                new LambdaUpdateWrapper<BamuContractNodePay>()
                        // 设置更新条件：根据合同ID和未删除状态进行筛选
                        .eq(BamuContractNodePay::getContractId, contractId)
                        .eq(BamuContractNodePay::getIsDeleted, DataDeletedStatus.NO.getType())
                        // 设置更新内容：将isDeleted字段设置为已删除状态
                        .set(BamuContractNodePay::getIsDeleted, DataDeletedStatus.YES.getType());
        // 执行更新操作，将符合条件的记录标记为已删除
        update(wrapper);
    }

    /**
     * 根据ID和是否已删除状态获取BamuContractNodePay对象
     * 此方法用于从数据库中查询并返回一个BamuContractNodePay对象，该对象的ID和是否已删除状态符合指定条件
     *
     * @param id BamuContractNodePay对象的唯一标识符
     * @return 如果找到符合条件的对象，则返回该对象；否则返回null
     */
    @Override
    public BamuContractNodePay getByIdAndIsDeleted(String id) {
        // 检查ID是否为空或空白，如果是，则直接返回null，表示无法找到对应的对象
        if (StringUtils.isBlank(id)) {
            return null;
        }
        // 创建一个LambdaQueryWrapper对象，用于构建查询条件
        LambdaQueryWrapper<BamuContractNodePay> wrapper =
                new LambdaQueryWrapper<BamuContractNodePay>()
                        // 设置查询条件：ID必须与提供的ID匹配
                        .eq(BamuContractNodePay::getId, id)
                        // 设置查询条件：是否已删除状态必须为未删除
                        .eq(BamuContractNodePay::getIsDeleted, DataDeletedStatus.NO.getType());
        // 使用构建的查询条件执行查询，并返回查询到的第一个对象，如果没有找到返回null
        return getOne(wrapper);
    }
}
